package main

import "fmt"

//vscode不支持go moudle
//指针
//Go语言中不存在指针操作，只需要记住两个符号
func main() {
	//1.& 取地址
	n := 18
	fmt.Println(&n)
	fmt.Printf("%p \n", &n)
	fmt.Printf("%T \n", &n) //*int    *代表指针，int类型指针

	//2.* 根据地址取值
	m := &n
	fmt.Println(*m)
	fmt.Printf("%T \n", *m)

	/* 	在Go语言中对于引用类型的变量，我们在使用的时候不仅要声明它，
	   	还要为它分配内存空间，否则我们的值就没办法存储。
	   	而对于值类型的声明不需要分配内存空间，
	   	是因为它们在声明的时候已经默认分配好了内存空间。要分配内存，
	   	就引出来今天的new和make。
	   	 Go语言中new和make是内建的两个函数，主要用来分配内存。
		panic: runtime error: invalid memory address or nil pointer dereference
	   	var a *int
	   	*a = 100
	   	fmt.Println(*a)

	   	var b map[string]int
	   	b["沙河娜扎"] = 100
	   	fmt.Println(b) */

	var a1 *int //未分配内存空间
	fmt.Println(a1)
	var a2 = new(int) //分配内存空间
	fmt.Println(*a2)
	fmt.Println(a2)
	*a2 = 100
	fmt.Println(*a2)
	/* 1.make和new都是用来申请内存的
	   2.new很少用，一般用来给基本数据类型申请内存，string\int返回对应类型的指针（*string *int）
	   3.make用来给slice 、map、chan申请内存，引用类型，make函数返回的是对应的这三个类型本身 */
}
